// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// Floor返回小于或等于x的最大整数值。
// 
// 特殊情况是：
// Floor（±0）=±0 
// Floor（±Inf）=±Inf 
// Floor（NaN）=NaN 
func Floor(x float64) float64 {
	if haveArchFloor {
		return archFloor(x)
	}
	return floor(x)
}

func floor(x float64) float64 {
	if x == 0 || IsNaN(x) || IsInf(x, 0) {
		return x
	}
	if x < 0 {
		d, fract := Modf(-x)
		if fract != 0.0 {
			d = d + 1
		}
		return -d
	}
	d, _ := Modf(x)
	return d
}

// Ceil返回大于或等于x的最小整数值。
// 
// 特殊情况是：
// Ceil（±0）=±0 
// Ceil（±Inf）=±Inf 
// Ceil（NaN）=NaN 
func Ceil(x float64) float64 {
	if haveArchCeil {
		return archCeil(x)
	}
	return ceil(x)
}

func ceil(x float64) float64 {
	return -Floor(-x)
}

// Trunc返回x的整数值。
// 
// ，从零开始四舍五入。
func Trunc(x float64) float64 {
	if haveArchTrunc {
		return archTrunc(x)
	}
	return trunc(x)
}

func trunc(x float64) float64 {
	if x == 0 || IsNaN(x) || IsInf(x, 0) {
		return x
	}
	d, _ := Modf(x)
	return d
}

// 
// 特殊情况是：
// Round（±0）=±0 
// Round（±Inf）=±Inf 
// Round（NaN）=NaN 
func Round(x float64) float64 {
	// Round是一个更快的实现：
	// 
	// func Round（x float64）float64{
	// 返回t+Copysign（1，x）
	// /}
	// 返回t 
	// /}
	bits := Float64bits(x)
	e := uint(bits>>shift) & mask
	if e < bias {
		// 包含非规范值的圆形abs（x）<1。
		bits &= signMask // /+-0 
		if e == bias-1 {
			bits |= uvone // /+-1 
		}
	} else if e < bias+shift {
		// 四舍五入任何包含分数成分的abs（x）>=1[0,1）.
		// 
		// 指数较大的数字返回不变，因为它们
		// 必须是整数、无穷大或NaN。
		const half = 1 << (shift - 1)
		e -= bias
		bits += half >> e
		bits &^= fracMask >> e
	}
	return Float64frombits(bits)
}

// RoundToEven返回最接近的整数，舍入关系为偶数。
// 
// 特殊情况是：
// RoundToEven（±Inf）=±Inf 
// RoundToEven（NaN）=NaN 
func RoundToEven(x float64) float64 {
	// RoundToEven是一个更快的实现：
	// 
	// func RoundToEven（x float64）float64{
	// /t:=math.Trunc（x）
	// 奇数：=math.余数（t，2）！=0 
	// return t+math.Copysign（1，x）
	// }
	// return t 
	// }
	bits := Float64bits(x)
	e := uint(bits>>shift) & mask
	if e >= bias {
		// /Round abs（x）>=1。
		// /-不含小数成分的大数、无穷大和NaN不变。
		// /-加0.499。。或0.5，这取决于被截断的
		// 数是偶数还是奇数（分别）。
		const halfMinusULP = (1 << (shift - 1)) - 1
		e -= bias
		bits += (halfMinusULP + (bits>>(shift-e))&1) >> e
		bits &^= fracMask >> e
	} else if e == bias-1 && bits&fracMask != 0 {
		// 第0.5轮<abs（x）<1。
		bits = bits&signMask | uvone // /+-1 
	} else {
		// 圆形abs（x）<=0.5，包括非规范值。
		bits &= signMask // /+-0 
	}
	return Float64frombits(bits)
}
